package com.analysis.utils;

import com.analysis.entity.User;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 用户工具类
 * 提供获取当前用户的通用方法
 */
public class UserUtils {

    private static final Logger logger = LoggerFactory.getLogger(UserUtils.class);

    /**
     * 从HttpServletRequest中获取当前用户
     *
     * @param request HTTP请求对象
     * @return 当前用户对象，如果未登录或获取失败则返回null
     */
    public static User getCurrentUser(HttpServletRequest request) {
        try {
            if (request == null) {
                return null;
            }
            Object currentUser = request.getAttribute("currentUser");
            if (currentUser != null) {
                return (User) currentUser;
            }
        } catch (Exception e) {
            logger.error("获取当前用户时发生异常", e);
        }
        return null;
    }

    /**
     * 从HttpServletRequest中获取当前用户ID
     *
     * @param request HTTP请求对象
     * @return 当前用户ID，如果未登录或获取失败则返回null
     */
    public static Long getCurrentUserId(HttpServletRequest request) {
        User currentUser = getCurrentUser(request);
        return currentUser != null ? currentUser.getId() : null;
    }

    /**
     * 从HttpServletRequest中获取当前用户昵称
     *
     * @param request HTTP请求对象
     * @return 当前用户昵称，如果未登录或获取失败则返回null
     */
    public static String getCurrentUserNick(HttpServletRequest request) {
        User currentUser = getCurrentUser(request);
        return currentUser != null ? currentUser.getNick() : null;
    }

    /**
     * 检查当前用户是否已登录
     *
     * @param request HTTP请求对象
     * @return true表示已登录，false表示未登录
     */
    public static boolean isUserLoggedIn(HttpServletRequest request) {
        return getCurrentUser(request) != null;
    }

    /**
     * 获取当前用户（带安全检查）
     * 如果用户未登录，会记录警告日志
     *
     * @param request HTTP请求对象
     * @return 当前用户对象，如果未登录则返回null
     */
    public static User getCurrentUserWithSecurityCheck(HttpServletRequest request) {
        User currentUser = getCurrentUser(request);
        if (currentUser == null) {
            logger.warn("尝试访问需要登录的接口，但用户未登录");
        }
        return currentUser;
    }

    /**
     * 获取当前用户（带异常抛出）
     * 如果用户未登录，会抛出IllegalStateException异常
     *
     * @param request HTTP请求对象
     * @return 当前用户对象
     * @throws IllegalStateException 如果用户未登录
     */
    public static User getCurrentUserOrThrow(HttpServletRequest request) throws IllegalStateException {
        User currentUser = getCurrentUser(request);
        if (currentUser == null) {
            throw new IllegalStateException("用户未登录，无法执行此操作");
        }
        return currentUser;
    }

    /**
     * 获取当前用户（带异常抛出和自定义错误消息）
     * 如果用户未登录，会抛出IllegalStateException异常
     *
     * @param request      HTTP请求对象
     * @param errorMessage 自定义错误消息
     * @return 当前用户对象
     * @throws IllegalStateException 如果用户未登录
     */
    public static User getCurrentUserOrThrow(HttpServletRequest request, String errorMessage) throws IllegalStateException {
        User currentUser = getCurrentUser(request);
        if (currentUser == null) {
            throw new IllegalStateException(errorMessage);
        }
        return currentUser;
    }

    /**
     * 创建用户的安全副本（移除敏感信息）
     *
     * @param user 原始用户对象
     * @return 安全副本，密码等敏感信息已被清空
     */
    public static User createSafeUserCopy(User user) {
        if (user == null) {
            return null;
        }

        User safeUser = new User();
        safeUser.setId(user.getId());
        safeUser.setNick(user.getNick());
        safeUser.setMobile(user.getMobile());
        safeUser.setOpenId(user.getOpenId());
        safeUser.setCreated(user.getCreated());
        safeUser.setModified(user.getModified());
        safeUser.setEnableStatus(user.getEnableStatus());
        // 注意：不设置password字段，确保敏感信息不会泄露

        return safeUser;
    }

    /**
     * 验证用户权限（基础版本）
     * 检查用户是否启用状态
     *
     * @param user 用户对象
     * @return true表示用户有权限，false表示无权限
     */
    public static boolean hasBasicPermission(User user) {
        if (user == null) {
            return false;
        }

        // 检查用户是否启用
        Integer enableStatus = user.getEnableStatus();
        return enableStatus != null && enableStatus == 1;
    }

    /**
     * 验证当前用户权限
     *
     * @param request HTTP请求对象
     * @return true表示用户有权限，false表示无权限
     */
    public static boolean hasCurrentUserPermission(HttpServletRequest request) {
        User currentUser = getCurrentUser(request);
        return hasBasicPermission(currentUser);
    }
}